#ifndef FUQUOS_IDT_TABLE_H
#define FUQUOS_IDT_TABLE_H

#include<fuquOS/type.h>

typedef struct {
    u32 eip;
    u32 cs;
    u32 eflags;
    u32 esp;
    u32 ss;
} exception_stack_frame;

// 中断服务程序引导注册函数
void notify_registration_isr();

// CPU 异常 ISR 函数，部分异常带有 error_code
void isr_divide_error(exception_stack_frame *frame);          // #DE  0  除零错误
void isr_debug(exception_stack_frame *frame);                 // #DB  1  调试异常
void isr_nmi(exception_stack_frame *frame);                   // #NMI 2  非屏蔽中断
void isr_breakpoint(exception_stack_frame *frame);            // #BP  3  断点（int 3）
void isr_overflow(exception_stack_frame *frame);              // #OF  4  溢出
void isr_bound_range_exceeded(exception_stack_frame *frame);  // #BR  5  数组边界超限
void isr_invalid_opcode(exception_stack_frame *frame);        // #UD  6  无效指令
void isr_device_not_available(exception_stack_frame *frame);  // #NM  7  设备不可用（无数学协处理器）

void isr_double_fault(exception_stack_frame *frame,u32 error_code);       // #DF  8  双重错误
void isr_coprocessor_segment_overrun(exception_stack_frame *frame);      // #9   协处理器段超限（保留，不再使用）
void isr_invalid_tss(exception_stack_frame *frame,u32 error_code);        // #TS 10  无效 TSS
void isr_segment_not_present(exception_stack_frame *frame,u32 error_code);// #NP 11  段不存在
void isr_stack_segment_fault(exception_stack_frame *frame,u32 error_code);// #SS 12  堆栈段错误
void isr_general_protection(exception_stack_frame *frame,u32 error_code); // #GP 13  通用保护异常
void isr_page_fault(exception_stack_frame *frame,u32 error_code);         // #PF 14  页面错误

void isr_reserved(exception_stack_frame *frame);               // #15  这个中断号保留
void isr_x87_fpu_error(exception_stack_frame *frame);          // #MF 16  x87 浮点异常
void isr_alignment_check(exception_stack_frame *frame,u32 error_code);// #AC 17  对齐检查
void isr_machine_check(exception_stack_frame *frame);          // #MC 18  机器检查
void isr_simd_floating_point(exception_stack_frame *frame);    // #XM 19  SIMD 浮点异常

void pit_handler();
#endif // FUQUOS_IDT_TABLE_H
